package com.cskaoyan._19collection._04api;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/**
 * @author Macro_Ray
 * @since 2024/3/29 11:43
 */
public class Demo3ToArray {
    @Test
    public void test() {
        // <T> T[] toArray(T[] a)：类似，只是传入了一个数组
    }

    @Test
    public void test2() {
        // Object[] toArray()：将collection转成一个数组，方便遍历
        // 转换成一个Object，然后再转换成String数组

        Collection<String> collection = new ArrayList<>();
        collection.add("李云龙");
        collection.add("孔捷");
        collection.add("楚云飞");
        collection.add("二营长");
        collection.add("秀芹");

        Object[] arr = collection.toArray();
        for (Object o : arr) {
            // 里面应该是个String
            System.out.println(o.getClass());
            // 转换成String
            String element = (String) o;
            // 名字长度小于3的打印

            if (element.length() < 3) {
                System.out.println(element);
            }
        }
    }

    @Test
    public void test3() {
        // <T> T[] toArray(T[] a)：将collection转成一个数组，如果数组的长度不够，则会自动扩容
        Collection<String> collection = new ArrayList<>();
        collection.add("李云龙");
        collection.add("孔捷");
        collection.add("楚云飞");
        collection.add("二营长");
        collection.add("秀芹");

        String[] arr = new String[5];
        String[] arr2 = collection.toArray(arr);

        System.out.println(arr2.length); // 4

        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr2));
        // 如果长度够会用你传入的数组
        // 如果长度不够，会用你的类型


    }

    @Test
    public void test4() {
        // 传入的数组类型要一致，否则会报错
        Collection<String> collection = new ArrayList<>();
        collection.add("李云龙");
        collection.add("孔捷");
        collection.add("二营长");
        collection.add("秀芹");

//        Integer[] arr = new Integer[10];
//        Integer[] arr2 = collection.toArray(arr);
//
//        System.out.println(Arrays.toString(arr));
    }


    @Test
    public void test5() {
        Collection<String> collection = new ArrayList<>();

        collection.toArray(); // 报错，因为没有参数，无法转换成数组
    }

    @Test
    public void test6() {
        // toArray的有参构造方法是怎么写的

        Collection<String> collection = new ArrayList<>();
        collection.add("李云龙");
        collection.add("孔捷");
        collection.add("二营长");

        //String[] array = new String[]{"1","2","3"}; //true
        String[] array = new String[]{"1", "2", "3", "4", "5"}; //true
        //String[] array = new String[]{"1","2"}; //false

        String[] returnarray = collection.toArray(array);

        System.out.println(array == returnarray);
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(returnarray));
//        collection.toArray(array);
    }

    @Test
    public void test7() {
        // toArray的有参构造方法

        Collection<String> collection = new ArrayList<>();
        collection.add("李云龙");
        collection.add("孔捷");
        collection.add("二营长");

//        String[] strings = new String[collection.size()];
//        collection.toArray(strings);

        //推荐的写法。
        String[] array = collection.toArray(new String[0]);

        System.out.println(Arrays.toString(array));

    }
}
